const db = require('../db/index')
const axios = require('axios')
// 导入jwt
const jwt = require('jsonwebtoken')
// 导入jwt配置文件用于加密与解密
const jwtconfig = require('../jwt_config/index')
// 生成uuid使用crypro库
const crypto = require('crypto')
// 处理文件的
const fs = require('fs')
const dayjs = require('dayjs')
const { putOSS, listBuckets, get } = require('../js/oss')
// 注册
exports.register = (req, res) => {
    // 获取前端传来的数据
    const reginfo = req.body
    // 第一步判断前端传来的数据有没有空
    if (!reginfo.password || !reginfo.phone) {
        return res.send({
            status: 1,
            message: '请补充完整信息'
        })
    }
    //第二部 判断前端传来的账号密码有没有可能已经存在
    // mysql的搜索语句
    const sql = 'select * from users where phone = ?'
    db.query(sql, reginfo.phone, (err, res2) => {
        if (res2.length > 0) {
            return res.send({
                status: 0,
                message: '账号已存在'
            })
        } else {
            // 第四步插入users表里
            const sqlInsertRegister = 'insert into users set ?'
            const create_time = new Date()
            let datas = {
                phone: reginfo.phone,
                password: reginfo.password,
                create_time: create_time,
                appid: reginfo.appid,
                openid: reginfo.openid,
                name: reginfo.name,
                image: reginfo.image
            }
            db.query(sqlInsertRegister, datas, (err, res2) => {
                // 插入失败的情况下
                // affectedRows为影响的行数 如果插入失败就没有影响就没有1
                if (err) return res.cc(err)

                if (res2.affectedRows !== 1) {
                    return res.send({
                        status: 1,
                        message: '注册失败'
                    })
                } else {
                    return res.send({
                        status: 1,
                        message: '注册成功'
                    })
                }


            })
        }
    })

}
// 待使用
// 微信一键登录 
exports.loginSmall = (req, res) => {
    let loginfo = req.body
    let selectSql = `select * from apps where appid =?`
    let openid = `select * from users where openid=?`
    db.query(selectSql, [loginfo.appid], (err, res2) => {
        if (err) return res.cc(err)
        if (res2.length > 0) {
            axios.get(`https://api.weixin.qq.com/sns/jscode2session?appid=${loginfo.appid}&secret=${loginfo.AppSecret}&js_code=${loginfo.code}&grant_type=authorization_code`)
                .then(response => {
                    db.query(openid, [response.data.openid], (err, res3) => {
                        if (err) return res.cc(err)
                        if (res3.length > 0) {
                            const user = {
                                ...res3[0],
                                password: '',
                                imageUrl: '',
                                create_time: ''
                            }
                            const tokenStr = jwt.sign(user, jwtconfig.jwtSecretKey, { expiresIn: jwtconfig.expiresIn })
                            res.send({
                                res: res3[0],
                                message: '登录成功',
                                token: 'Bearer ' + tokenStr,
                                type: 1
                            })
                        } else {
                            res.send({
                                message: '没有此用户',
                                type: 0,
                                openid: response.data.openid
                            })
                        }
                    })
                })
                .catch(error => {
                    res.send({
                        message: error,
                        type: 0
                    })
                })
        }
    })

    // console.log(loginfo)

}
// 登录
exports.login = (req, res) => {
    const loginfo = req.body
    //    第一步查看数据库中有没有前端传来账号
    const sqlSelect = 'select * from users where phone = ? and appid=?'
    db.query(sqlSelect, [loginfo.phone, loginfo.appid], (err, res2) => {
        // // 判断如果有没有直接
        if (err) return res.cc(err)
        // // // 没有查询到数据
        if (res2.length != 1) return res.cc('没有此用户')
        if (res2[0].password !== loginfo.password) {
            return res.cc('登录失败')
        }
        // 第三步判断账号是否冻结
        if (res2[0].status == 1) {
            return res.cc('账号已经冻结')
        }
        // // 第四步生成token返回给前端 需要剔除头像创建时间
        const user = {
            ...res2[0],
            password: '',
            imageUrl: '',
            create_time: ''
        }
        const tokenStr = jwt.sign(user, jwtconfig.jwtSecretKey, { expiresIn: jwtconfig.expiresIn })
        res.send({
            res: res2[0],
            message: '登录成功',
            token: 'Bearer ' + tokenStr
        })

    })
}

// 注册门店
exports.registerStore = (req, res) => {
    // 获取前端传来的数据
    const reginfo = req.body
    // 第一步判断前端传来的数据有没有空
    if (!reginfo.password || !reginfo.phone) {
        return res.send({
            status: 0,
            message: '请补充完整信息'
        })
    }
    // 第二步,对密码进行加密
    // 需要使用中间件进行加密bcrypt.js
    // bcrypt.hashSync第一个参数是传入的密码第二个是加密长度
    // reginfo.password = bcrypt.hashSync(reginfo.password, 10)
    // 第四步插入users表里
    if (reginfo.location) {
        const sqlInsertRegister = `insert into store  ( phone,head,password,name,location,type,linkman,status,region,appid,create_time,location2 ) values (?,?,?,?,?,?,?,?,?,?,?,st_GeomFromText(?))`
        let datas = {
            phone: reginfo.phone,
            head: reginfo.head,
            password: reginfo.password,
            name: reginfo.name,
            location: JSON.stringify(reginfo.location),
            type: reginfo.type,
            linkman: reginfo.linkman,
            status: false,
            region: JSON.stringify(reginfo.region),
            appid: reginfo.appid,
            create_time: reginfo.create_time ? reginfo.create_time : dayjs().format('YYYYMMDD'),

        }
        let location = `POINT(${reginfo.location.longitude} ${reginfo.location.latitude})`
        db.query(sqlInsertRegister, [datas.phone, datas.head, datas.password, datas.name, datas.location, datas.type, datas.linkman, datas.status, datas.region, datas.appid, datas.create_time, location], (err, res2) => {
            // 插入失败的情况下
            // affectedRows为影响的行数 如果插入失败就没有影响就没有1
            if (err) return res.cc(err)

            if (res2.affectedRows !== 1) {
                return res.send({
                    status: 0,
                    message: '注册失败'
                })
            } else {
                res.send({
                    status: 1,
                    message: '注册成功,等待管理员审核'
                })
            }


        })
    } else {
        const sqlInsertRegister = `insert into store set  ?`
        let datas = {
            phone: reginfo.phone,
            head: reginfo.head,
            password: reginfo.password,
            name: reginfo.name,
            type: reginfo.type,
            linkman: reginfo.linkman,
            status: false,
            region: JSON.stringify(reginfo.region),
            appid: reginfo.appid,
            create_time: reginfo.create_time ? reginfo.create_time : dayjs().format('YYYYMMDD'),

        }
        db.query(sqlInsertRegister, [datas], (err, res2) => {
            // 插入失败的情况下
            // affectedRows为影响的行数 如果插入失败就没有影响就没有1
            if (err) return res.cc(err)

            if (res2.affectedRows !== 1) {
                return res.send({
                    status: 0,
                    message: '注册失败'
                })
            } else {
                res.send({
                    status: 1,
                    message: '注册成功,等待管理员审核'
                })
            }


        })
    }


}
// 登录门店
exports.loginStore = (req, res) => {
    const loginfo = req.body
    //    第一步查看数据库中有没有前端传来账号
    const sqlSelect = 'select * from store where phone = ? and status = 1 and appid=?'
    db.query(sqlSelect, [loginfo.phone, loginfo.appid], (err, res2) => {
        // // 判断如果有没有直接
        if (err) return res.cc(err)
        if (res2.length > 0) {
            if (res2[0].password !== loginfo.password) {
                res.send({
                    message: '账号或密码错误',
                })
            } else {
                // 第三步判断账号是否审核通过
                if (res2[0].status == 1) {
                    // // 第四步生成token返回给前端 需要剔除头像创建时间
                    const user = {
                        ...res2[0],
                        password: '',
                        imageUrl: '',
                        create_time: ''
                    }
                    const tokenStr = jwt.sign(user, jwtconfig.jwtSecretKey, { expiresIn: jwtconfig.expiresIn })
                    res.send({
                        res: res2[0],
                        message: '登录成功',
                        token: 'Bearer ' + tokenStr
                    })
                } else if (res2[0].status == 0) {
                    return res.cc('待审核')
                }
            }
        } else {
            res.send({
                message: '没有此账号'
            })
        }




    })
}
// 上传图片
exports.uploadAvatar = (req, res) => {
    // 生成唯一标识
    let oldName = Buffer.from(req.files[0].originalname, 'latin1').toString('utf8')
    let fileName = `.${oldName.split('.').pop()}`
    const newName = crypto.randomBytes(6).toString('hex') + fileName
    let name = req.files[0].filename
    fs.renameSync(`./public/upload/${name}`, `./public/upload/${newName}`)
    putOSS(newName, `./public/upload/${newName}`).then((ossResult) => {
        // console.log(ossResult)
        const sql = 'insert into image set ?'
        db.query(sql, {
            image_url: ossResult.url,
        }, (err, result) => {
            if (err) return res.cc(err)
            fs.unlinkSync(`./public/upload/${newName}`)
            res.send({
                image_url: ossResult.url,
            })
        })
    })

}

// admin登录接口
exports.loginAdmin = (req, res) => {
    const loginfo = req.body
    //    第一步查看数据库中有没有前端传来账号
    const sqlSelect = 'select * from adminusers where phone = ?'
    db.query(sqlSelect, loginfo.phone, (err, res2) => {
        // // 判断如果有没有直接
        if (err) return res.cc(err)
        // // // 没有查询到数据
        if (res2.length != 1) return res.cc('登录失败,没有此用户')
        if (res2[0].password !== loginfo.password) {
            return res.cc('登录失败')
        }

        // // 第四步生成token返回给前端 需要剔除头像创建时间
        const user = {
            ...res2[0],
            password: '',
            imageUrl: '',
            create_time: ''
        }
        const tokenStr = jwt.sign(user, jwtconfig.jwtSecretKey, { expiresIn: jwtconfig.expiresIn })
        res.send({
            res: res2[0],
            message: '登录成功',
            token: 'Bearer ' + tokenStr
        })

    })

}
// 获取小程序列表
exports.appList = (req, res) => {
    console.log(req.query.appid)
    let appid = req.query.appid ? JSON.parse(req.query.appid).join(',') : ''
    let sql = ''
    if (appid) {
        sql = `select * from apps where _id in(${appid})`
    } else {
        sql = `select * from apps`
    }
    db.query(sql, (err, res2) => {
        if (err) return res.cc(err)
        res.send({
            res: res2
        })
    })
}
// 获取菜单列表
exports.menus = (req, res) => {
    let appid = JSON.parse(req.query.appid).join(',')
    const sql = `select * from menus where appid in(${appid})`
    db.query(sql, (err, res2) => {
        if (err) return res.cc(err)
        res.send({
            res: res2
        })
    })
}
// 获取用户详情
exports.getUserInfo = (req, res) => {
    let data = req.body
    const sql = `select * from adminusers where _id=?`
    db.query(sql, [data._id], (err, res2) => {
        if (err) return res.cc(err)
        res.send({
            res: res2[0]
        })
    })
}
// 获取程序id
exports.getAppInfo = (req, res) => {
    let data = req.body
    if (data.appName) {
        const sql = `select * from apps where name=?`
        db.query(sql, [data.appName], (err, res2) => {
            if (err) return res.cc(err)
            res.send({
                res: res2[0]
            })
        })
    } else {
        const sql = `select * from apps`
        db.query(sql, (err, res2) => {
            if (err) return res.cc(err)
            res.send({
                res: res2[0]
            })
        })
    }

}
// 小程序获取所有同个账号下的门店
exports.getstoreList = (req, res) => {
    let data = req.body
    const sql = `select * from store where phone=? and password=? and appid=?`
    db.query(sql, [data.phone, data.password, data.appid], (err, res2) => {
        res.send({
            res: res2
        })
    })
}